package com.imis.base.globle;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.imis.base.constant.enums.SysTipEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * <p>
 * Result<br>
 * 接口返回对象
 * </p>
 *
 * @author XinLau
 * @version 1.0
 * @since 2020年03月26日 11:18
 */
@Data
@ApiModel(value = "接口返回对象", description = "接口返回对象")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result<T> implements Serializable {

    /**
     * 成功标志
     */
    @ApiModelProperty(value = "成功标志")
    private boolean success = Boolean.TRUE;

    /**
     * 返回处理消息
     */
    @ApiModelProperty(value = "返回处理消息")
    private String message = SysTipEnum.SC_OK_200.getValue();

    /**
     * 返回代码
     */
    @ApiModelProperty(value = "返回代码")
    private Integer code = 0;

    /**
     * 返回数据对象 data
     */
    @ApiModelProperty(value = "返回数据对象")
    private T result;

    /**
     * 时间戳
     */
    @ApiModelProperty(value = "时间戳")
    private long timestamp = System.currentTimeMillis();

    public Result() {

    }

    /**
     * 静态成功信息返回
     */
    public static Result<Object> ok() {
        Result<Object> r = new Result<>();
        r.setSuccess(true);
        r.setCode(SysTipEnum.SC_OK_200.getKey());
        r.setMessage(SysTipEnum.SC_OK_200.getValue());
        return r;
    }

    /**
     * 静态成功信息返回
     *
     * @param data - Object
     */
    public static Result<Object> ok(Object data) {
        Result<Object> r = new Result<>();
        r.setSuccess(true);
        r.setCode(SysTipEnum.SC_OK_200.getKey());
        r.setMessage(SysTipEnum.SC_OK_200.getValue());
        r.setResult(data);
        return r;
    }

    /**
     * 静态错误信息返回
     *
     * @param sysTipEnum - 返回信息
     */
    public static Result<Object> errors(SysTipEnum sysTipEnum) {
        Result<Object> r = new Result<>();
        r.setCode(sysTipEnum.getKey());
        r.setMessage(sysTipEnum.getValue());
        r.setSuccess(false);
        return r;
    }

    /**
     * 静态格式化错误信息返回
     *
     * @param sysTipEnum - 返回信息
     * @param args       - 参数
     */
    public static Result<Object> errorsFormat(SysTipEnum sysTipEnum, Object... args) {
        Result<Object> r = new Result<>();
        r.setSuccess(false);
        r.setCode(sysTipEnum.getKey());
        r.setMessage(String.format(sysTipEnum.getValue(), args));
        return r;
    }

    /**
     * 成功返回结果
     */
    public Result<T> success() {
        this.message = SysTipEnum.SC_OK_200.getValue();
        this.code = SysTipEnum.SC_OK_200.getKey();
        this.success = true;
        return this;
    }

    /**
     * 格式化错误信息返回
     *
     * @param sysTipEnum - 返回信息
     * @param args       - 参数
     * @return
     */
    public Result<T> errorFormat(SysTipEnum sysTipEnum, Object... args) {
        this.message = String.format(sysTipEnum.getValue(), args);
        this.code = sysTipEnum.getKey();
        this.success = false;
        return this;
    }

    /**
     * 错误500返回结果
     */
    public Result<T> error500() {
        this.message = SysTipEnum.SC_ERROR_500.getValue();
        this.code = SysTipEnum.SC_ERROR_500.getKey();
        this.success = false;
        return this;
    }

}
